package pe.com.ztaxi.taxis.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import pe.com.ztaxi.taxis.model.Destino;
import pe.com.ztaxi.taxis.model.Empresa;
import pe.com.ztaxi.taxis.model.Pasajero;
import pe.com.ztaxi.taxis.model.Punto;
import pe.com.ztaxi.taxis.model.Telefono;
import pe.com.ztaxi.taxis.model.Zona;
import pe.com.ztaxi.taxis.service.ZonaService;

@Component
public class TaxiJsonUtil {

	public final static String BTN_ELIMINAR = "<div class='visible-md visible-lg hidden-sm hidden-xs action-buttons'><button type='button' class='btn btn-minier btn-light btnEliminarDestino'><i class='fa fa-trash-o bigger-130 red'></i></button></div>";
	
	@Autowired
	private ZonaService zonaService;
	
	public String armarJsonDestino(List<Destino> listaDestinos){
		// Write JSON string.        
        StringBuilder json = new StringBuilder();
        Integer numeroR =listaDestinos.size();
        json.append("{  \"sEcho\": ");
        json.append(1);
        json.append(",\"iTotalRecords\": ");
        json.append(numeroR);
        json.append(",\"iTotalDisplayRecords\": ");
        json.append(numeroR);
        json.append(",\"aaData\": [");       
        for(Destino destino : listaDestinos){
        	json.append("[");
            
            json.append("\"");
            json.append(destino.getPuntoDestino().getDireccion().replace(",","-"));
            json.append("\"");
            json.append(",");
            
            json.append("\"");
            json.append(destino.getPuntoDestino().getZona().getNombre().replace(",","-"));
            json.append("\"");
            json.append(",");
            
            json.append("\"");
            json.append(destino.getTarifa());
            json.append("\"");
            json.append(",");
            
            json.append("\"");
            json.append(BTN_ELIMINAR);
            json.append("\"");
            json.append(",");
            
            json.append("\"");
            json.append(destino.getPuntoDestino().getLatitud());
            json.append("\"");
            json.append(",");
            
            json.append("\"");
            json.append(destino.getPuntoDestino().getLongitud());
            json.append("\"");
            json.append("],");
        }
        if(!listaDestinos.isEmpty()){
        	json.deleteCharAt(json.length()-1);
        }        
        json.append("]}");
        System.out.println(json);
        return json.toString();
	}
	
	public String armarJsonDestino(List<Destino> listaDestinos, Punto origen){
		// Write JSON string.        
        StringBuilder json = new StringBuilder();
        Integer numeroR =listaDestinos.size();
        json.append("{  \"sEcho\": ");
        json.append(1);
        json.append(",\"iTotalRecords\": ");
        json.append(numeroR);
        json.append(",\"iTotalDisplayRecords\": ");
        json.append(numeroR);
        json.append(",\"origen\": [");
        json.append("\"");
        json.append(origen.getDireccion());
        json.append("\",\"");
        json.append(origen.getZona().getNombre());
        json.append("\",");
        json.append(origen.getLatitud());
        json.append(",");
        json.append(origen.getLongitud());
        json.append("]");
        json.append(",\"aaData\": [");       
        for(Destino destino : listaDestinos){
        	json.append("[");
            
            json.append("\"");
            json.append(destino.getPuntoDestino().getDireccion().replace(",","-"));
            json.append("\"");
            json.append(",");
            
            json.append("\"");
            json.append(destino.getPuntoDestino().getZona().getNombre().replace(",","-"));
            json.append("\"");
            json.append(",");
            
            json.append("\"");
            json.append(destino.getTarifa());
            json.append("\"");
            json.append(",");
            
            json.append("\"");
            json.append(BTN_ELIMINAR);
            json.append("\"");
            json.append(",");
            
            json.append("\"");
            json.append(destino.getPuntoDestino().getLatitud());
            json.append("\"");
            json.append(",");
            
            json.append("\"");
            json.append(destino.getPuntoDestino().getLongitud());
            json.append("\"");
            json.append("],");
        }
        if(!listaDestinos.isEmpty()){
        	json.deleteCharAt(json.length()-1);
        }        
        json.append("]}");
        System.out.println(json);
        return json.toString();
	}
	
	public String armarJsonDestino(List<Destino> listaDestinos, Punto origen, String tipoServicio){
		// Write JSON string.        
        StringBuilder json = new StringBuilder();
        Integer numeroR =listaDestinos.size();
        json.append("{  \"sEcho\": ");
        json.append(1);
        json.append(",\"iTotalRecords\": ");
        json.append(numeroR);
        json.append(",\"iTotalDisplayRecords\": ");
        json.append(numeroR);
        json.append(",\"tipoServicio\": \"");
        json.append(tipoServicio);
        json.append("\",\"origen\": [");
        json.append("\"");
        json.append(origen.getDireccion());
        json.append("\",\"");
        json.append(origen.getZona().getNombre());
        json.append("\",");
        json.append(origen.getLatitud());
        json.append(",");
        json.append(origen.getLongitud());
        json.append("]");
        json.append(",\"aaData\": [");       
        for(Destino destino : listaDestinos){
        	json.append("[");
            
            json.append("\"");
            json.append(destino.getPuntoDestino().getDireccion().replace(",","-"));
            json.append("\"");
            json.append(",");
            
            json.append("\"");
            json.append(destino.getPuntoDestino().getZona().getNombre().replace(",","-"));
            json.append("\"");
            json.append(",");
            
            json.append("\"");
            json.append(destino.getTarifa());
            json.append("\"");
            json.append(",");
            
            json.append("\"");
            json.append(BTN_ELIMINAR);
            json.append("\"");
            json.append(",");
            
            json.append("\"");
            json.append(destino.getPuntoDestino().getLatitud());
            json.append("\"");
            json.append(",");
            
            json.append("\"");
            json.append(destino.getPuntoDestino().getLongitud());
            json.append("\"");
            json.append("],");
        }
        if(!listaDestinos.isEmpty()){
        	json.deleteCharAt(json.length()-1);
        }        
        json.append("]}");
        System.out.println(json);
        return json.toString();
	}
	
	public List<Destino> deserializarDataTable(String[] destinos){
		List<Destino> listaDestinos = new ArrayList<Destino>();			
		for (int i = 0; i < destinos.length/6; i++) {
			Destino dAux = new Destino();
			Punto pAux = new Punto();
			Zona zAux = new Zona();	
			pAux.setZona(zAux);
			dAux.setPuntoDestino(pAux);
			pAux.setDireccion(destinos[6*i]);
			pAux.setLatitud(Double.parseDouble(destinos[6*i+4]));
			pAux.setLongitud(Double.parseDouble(destinos[6*i+5]));			
			zAux.setNombre(destinos[6*i+1]);
			dAux.setTarifa(Double.parseDouble(destinos[6*i+2]));
			listaDestinos.add(dAux);			
		}
		return listaDestinos;
	}
	
	public String armarListaPasajeros(List<Pasajero> listaPasajeros){
		// Write JSON string.        
        StringBuilder json = new StringBuilder();
        json.append("{[");      
        for(Pasajero pasajero : listaPasajeros){
        	
        	json.append("{label:");            
            json.append("\"");
            json.append(pasajero.getAbreviado().replace(","," "));
            json.append("\"");
            
            json.append(",category:");            
            json.append("\"");
            if(pasajero.isFlagPertenece()){
            	json.append("Pasajeros Propios");
            } else {
            	json.append("Otros");
            }
            json.append("\"");
            
            json.append(",nombres:");            
            json.append("\"");
            json.append(pasajero.getNombres().replace(","," "));
            json.append("\"");
            
            json.append(",apellidos:");            
            json.append("\"");
            json.append(pasajero.getApellidos().replace(","," "));
            json.append("\"");
            
            json.append(",tipoDoc:");            
            json.append("\"");
            json.append(pasajero.getTipoDocumento().replace(","," "));
            json.append("\"");
            
            json.append(",numDoc:");            
            json.append("\"");
            json.append(pasajero.getNumDocumento().replace(","," "));
            json.append("\"");
            
            json.append(",celular:");            
            json.append("\"");
            json.append(pasajero.getTodosTelefonos().replace(","," "));
            json.append("\"");
            
            json.append(",flagPertenece:");            
            json.append("\"");
            json.append(pasajero.isFlagPertenece());
            json.append("\"");
            
            json.append(",codigo:");            
            json.append("\"");
            json.append(pasajero.getCodigo());
            json.append("\"");
            
            json.append("},");
        }
        if(!listaPasajeros.isEmpty()){
        	json.deleteCharAt(json.length()-1);
        }        
        json.append("]}");
        System.out.println(json);
        return json.toString();
	}
	
	public List<Destino> prepararDestinos(String[] destinos){
		List<Destino> listaDestinos = new ArrayList<Destino>();			
		for (int i = 0; i < destinos.length/6; i++) {
			Destino dAux = new Destino();
			Punto pAux = new Punto();
			pAux.setZona(zonaService.ubicarZona(destinos[6*i+1]));
			dAux.setPuntoDestino(pAux);
			pAux.setDireccion(destinos[6*i]);
			pAux.setLatitud(Double.parseDouble(destinos[6*i+4]));
			pAux.setLongitud(Double.parseDouble(destinos[6*i+5]));
			dAux.setTarifa(Double.parseDouble(destinos[6*i+2]));
			listaDestinos.add(dAux);			
		}
		return listaDestinos;
	}
	
	public Punto prepararOrigen(String[] origen){
		Punto puntoOrigen = new Punto();
		puntoOrigen.setDireccion(origen[0]);
		puntoOrigen.setZona(zonaService.ubicarZona(origen[1]));
		puntoOrigen.setLatitud(Double.parseDouble(origen[2]));
		puntoOrigen.setLongitud(Double.parseDouble(origen[3]));		
		return puntoOrigen;
	}
	
	public List<Pasajero> deserializarPasajeros(String[] pasajeros, Empresa empresa){
		List<Pasajero> listaPasajeros = new ArrayList<Pasajero>();			
		for (int i = 0; i < pasajeros.length/6; i++) {
			if(!pasajeros[6*i].isEmpty() && !pasajeros[6*i+1].isEmpty()){
				Pasajero pAux = new Pasajero();
				pAux.setEmpresa(empresa);
				pAux.setNombres(pasajeros[6*i]);
				pAux.setApellidos(pasajeros[6*i+1]);
				pAux.setTipoDocumento(pasajeros[6*i+2]);
				pAux.setNumDocumento(pasajeros[6*i+3]);
				List<Telefono> telefonos = new ArrayList<Telefono>();
				Telefono t = new Telefono();
				t.setNumero(pasajeros[6*i+4]);
				t.setPersona(pAux);
				telefonos.add(t);
				pAux.setTelefonos(telefonos);
				if(pasajeros[6*i+5].equals("No")){
					pAux.setFlagPertenece(false);
				} else {
					pAux.setFlagPertenece(true);
				}
				listaPasajeros.add(pAux);
			}						
		}
		return listaPasajeros;
	}
	
	public List<Date> deserializarFechas(Date[] fechasRaw, String[] horas){
		try {
			List<Date> listaFechas = new ArrayList<Date>();
			SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
			Calendar fAux = Calendar.getInstance();
			for(Date fecha: fechasRaw){
				for (int i = 0; i < horas.length; i++) {
					Calendar nueva = Calendar.getInstance();
					nueva.setTime(fecha);
					if(horas[i].equals("ahora")){
						fAux = Calendar.getInstance();						
					} else {
						fAux.setTime(sdf.parse(horas[i]));
					}
					nueva.set(Calendar.HOUR_OF_DAY, fAux.get(Calendar.HOUR_OF_DAY));
					nueva.set(Calendar.MINUTE, fAux.get(Calendar.MINUTE));
					if(horas[i].equals("ahora")){
						//valor para diferenciar las fechas que son para 'ahora' TODO: crear clase exclusiva para fecha
						nueva.set(Calendar.SECOND, 30);
					}
					listaFechas.add(nueva.getTime());
				}
			}
			return listaFechas;
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	
	public String armarRespuestaValidacion(Integer numeroOrdenes, boolean valFechas, boolean valPasajeros){
		String msjeFechas =  "La fecha u hora programada no debe ser menor a la hora actual mas 30 minutos";
		String msjePasajeros = "La orden presenta pasajeros duplicados o con cruce de servicio";
		String status;
		if(valFechas && valPasajeros){
			status = "OK";
		} else{
			status = "ERROR";
		}
		StringBuilder json = new StringBuilder();		
        json.append("{  \"status\":\" ");
        json.append(status);
        json.append("\",\"numeroOrdenes\": ");
        json.append(numeroOrdenes);
        json.append(",\"errores\": [");
        if(valFechas == false){
        	json.append("\"");
            json.append(msjeFechas);
            json.append("\"");
            if(valPasajeros == false){
            	json.append(",");
            }
        }
        if(valPasajeros == false){
        	json.append("\"");
            json.append(msjePasajeros);
            json.append("\"");
        }        
        json.append("]}");
        System.out.println(json);
        return json.toString();
	}
	
	public ArrayList<Punto> prepararPuntos(String[] puntos){
		ArrayList<Punto> listaPuntos = new ArrayList<Punto>();
		for (int i = 0; i < puntos.length/2; i++) {
			Punto pAux = new Punto();
			pAux.setLatitud(Double.parseDouble(puntos[2*i]));
			pAux.setLongitud(Double.parseDouble(puntos[2*i+1]));
			listaPuntos.add(pAux);
		}	
		return listaPuntos;
	}
	
	public ArrayList<Punto> prepararPuntos(String puntos){
		String pAux = puntos.replace("(", "");
		pAux = pAux.replace(")", ",");
		pAux = pAux.subSequence(0, pAux.length() - 1).toString();
		return prepararPuntos(pAux.split(","));
	}
}
